package Api;

import Util.HttpUtil;
import Util.Tools;
import java.util.HashMap;
import java.util.Map;
import static Util.Tools.getMD5;

/**
 * 退款查询接口
 * 以下为返回数据示例
 * <?xml version="1.0" encoding="utf-8"?><root><ret_code>0000</ret_code><ret_msg>查询成功</ret_msg><agent_id>1664502</agent_id><detail_data>H2401093558089AW,,0.01,2,2024-01-09 16:29:24,4437105,0.0002,0.0000</detail_data><sign>6566620b4b1e6bbf7c09966e67a0ec24</sign></root>
 *
 */

public class PaymentRefundQuery {

    public static void main(String[] args) {
        try {

            // 目标URL
            String url = "https://Query.heepay.com/API/Payment/PaymentRefundQuery.aspx";
            // 需要的MD5密钥，商户后台退款版本一的密钥
            String key = "1C3A345D4F1E48B7A02B90AC";
            // 商户编号，（汇付宝商户内码：七位整数数字）
            String agent_id = "1664502";
            // 固定版本号
            String version = "1";
            // 商户系统内部的支付订单号（要保证唯一）
            String agent_bill_id = "BSP20250806000000002";
            String sign_type = "MD5";

            // 拼接待加密参数
            String signData = String.format("agent_bill_id=%s&agent_id=%s&key=%s&version=%s", agent_bill_id, agent_id, key, version).toLowerCase();
            System.out.println("待签名串：" + signData);

            // MD5加密得出签名结果
            String sign = getMD5(signData);

            // 请求参数，以Map形式表示
            Map<String, String> parameters = new HashMap<>();
            parameters.put("version", version);
            parameters.put("agent_id", agent_id);
            parameters.put("agent_bill_id", agent_bill_id);
            parameters.put("sign_type", sign_type);
            parameters.put("sign", sign);

            String response = HttpUtil.sendPost1(url, parameters);
            System.out.println(response);

            // 解析response，获取需要的数据
            Map<String, String> resultMap = Tools.parseXml(response);
            String ret_code = resultMap.get("ret_code");
            String ret_msg = resultMap.get("ret_msg");
            String detail_data = resultMap.get("detail_data");
            String sign1 = resultMap.get("sign");

            // 拼接待签名参数
            String verifySignData = String.format("agent_id=%s&detail_data=%s&key=%s&ret_code=%s&ret_msg=%s", agent_id, detail_data, key, ret_code, ret_msg).toLowerCase();
            System.out.println("待验签签名串：" + verifySignData);

            String sign2 = getMD5(verifySignData);

            if (sign1.equals(sign2)) {
                System.out.println("同步验签结果：验签成功");
            } else {
                System.out.println("同步验签结果：验签失败");
            }

        } catch (Exception e) {
            // 增加适当的错误处理机制，打印错误信息并抛出自定义异常
            System.err.println("退款查询请求失败: " + e.getMessage());
            throw new RuntimeException("退款查询请求失败", e);
        }
    }
}
